[Ruby on Rails]FactoryGirlによるテストデータの準備
はじめに
RSpecを使ってテストを記述している際、テストの実行前にデータをテーブルに登録しておきたいケースが多々あるかと思います。RSpec内でActiveRecordを使ってデータを登録することもできますが、複数のテストケースで同じデータを使いたい場合、データの定義は一箇所で行いたいところです。
この様な場合、Factory Girlを使用すると、一箇所でテストデータを定義できます。今回はこのFactoryGirlの使い方について書きたいと思います。
使い方
使い方の大まかな流れとしては、
- FactoryGirlが使用できるようにする
- 定義ファイルにデータを定義する
- 必要とするテストケースにてファイルを読み込み、データを適時加工して登録する
という感じとなります。尚、この定義したデータを「Factory」とも言います。以下、手順です。
1.Gemfile
Gemfileに以下を記述し、bundle installします。test時にしか使わない場合(ほとんどこのケースと思われる)、「group :test」の中に記述したほうがいいと思います。
group :test do gem 'factory_girl_rails' end
2.spec_helper
spec_helper.rbに以下を記述し、Factoryに定義したデータを、テスト実行時に毎回読み込むようにします。
config.before(:all) do FactoryGirl.reload end
3.Factoryの定義
Factoryは、/spec/factoriesフォルダ内に作成します。このフォルダは自動では作成されないため、最初は手動で作成してください。factoriesフォルダ内に、.rbファイルを作成し、Factoryを定義します。例えば、以下のような感じです。
spec/factories/articles.rb
FactoryGirl.define do factory :article do title "title" content "This is a Sample Article." image_file_name "article.img" end end
2行目の「:article」が今回定義したFactory名です。3〜5行目に、データベースに登録したい値を定義します。今回はFactory名とRailsのModel名が一致していますが、一つのModelに複数のFactoryを定義する場合などは以下のように記述します。
factory :article_sample, class: Article do
4.RSpecからの呼び出し
テストデータを必要とする箇所より、FactoryGirl.create()メソッドを使用して、上記で定義したFactoryをデータベースに登録します。
@article1 = FactoryGirl.create(:article, { title: 'title1', image_file_name: 'IMG_0192.JPG'}) @article2 = FactoryGirl.create(:article, { title: 'title2', image_file_name: 'IMG_0194.JPG'})
「:article」で定義したFactoryを指定し、続くハッシュ内で登録値を定義し直しています。このようにすると、Factoryではデフォルト値を定義しておき、各テストケース内では固有の値のみを記述して登録する、ということが可能です。勿論、ハッシュにて値を記述しなければ、Factoryに定義した値が全て登録されます。
まとめ
FactoryGirlを使うことで、記述の重複がなく、分かりやすい形でテストデータを定義できることが分かるかと思います。